﻿using CodeSaude.Application.Interfaces;
using CodeSaude.Application.Services;
using CodeSaude.Domain.Interfaces.Repository;
using CodeSaude.Domain.Interfaces.Service;
using CodeSaude.Domain.Services;
using CodeSaude.Infra.CrossCutting.IoC.Provider.Abstract;
using CodeSaude.Infrastructure.CrossCutting.IoC.Provider.Concrete;
using CodeSaude.Infrastructure.Data.Context;
using CodeSaude.Infrastructure.Data.Interfaces;
using CodeSaude.Infrastructure.Data.Repositories;
using CodeSaude.Infrastructure.Data.UoW;
using Ninject.Modules;

namespace CodeSaude.Infrastructure.CrossCutting.IoC
{
    public class NinjectModulo : NinjectModule
    {
        public override void Load()
        {
            #region application
            Bind<IUsuarioApplicationService>().To<UsuarioApplicationService>();
            Bind<IAutenticacaoProvider>().To<CustomAutenticacaoProvider>();
            Bind<IGrupoUsuarioApplicationService>().To<GrupoUsuarioApplicationService>();
            Bind<IAlergiaApplicationService>().To<AlergiaApplicationService>();
            Bind<IAntecedenteApplicationService>().To<AntecedenteApplicationService>();
            Bind<ILocalEspecialidadeApplicationService>().To<LocalEspecialidadeApplicationService>();
            Bind<ILocalAtendimentoApplicationService>().To<LocalAtendimentoApplicationService>();
            Bind<IDiagnosticoApplicationService>().To<DiagnosticoApplicationService>();
            Bind<IDicionarioFoneticoApplicationService>().To<DicionarioFoneticoApplicationService>();
            Bind<ICuidadoApplicationService>().To<CuidadoApplicationService>();
            Bind<IDietaApplicationService>().To<DietaApplicationService>();
            Bind<IEspecialidadeApplicationService>().To<EspecialidadeApplicationService>();
            Bind<IExameApplicationService>().To<ExameApplicationService>();
            Bind<ILeitoApplicationService>().To<LeitoApplicationService>();
            Bind<IProcedimentoApplicationService>().To<ProcedimentoApplicationService>();
            Bind<IProntuarioApplicationService>().To<ProntuarioApplicationService>();
            Bind<IFuncaoApplicationService>().To<FuncaoApplicationService>();
            #endregion

            #region domain service
            Bind(typeof(IBaseService<>)).To(typeof(BaseService<>));
            Bind<IUsuarioService>().To<UsuarioService>();
            Bind<IGrupoUsuarioService>().To<GrupoUsuarioService>();
            Bind<IAlergiaService>().To<AlergiaService>();
            Bind<IAntecedenteService>().To<AntecedenteService>();
            Bind<ILocalEspecialidadeService>().To<LocalEspecialidadeService>();
            Bind<ILocalAtendimentoService>().To<LocalAtendimentoService>();
            Bind<IDiagnosticoService>().To<DiagnosticoService>();
            Bind<IDicionarioFoneticoService>().To<DicionarioFoneticoService>();
            Bind<ICuidadoService>().To<CuidadoService>();
            Bind<IDietaService>().To<DietaService>();
            Bind<IEspecialidadeService>().To<EspecialidadeService>();
            Bind<IExameService>().To<ExameService>();
            Bind<ILeitoService>().To<LeitoService>();
            Bind<IProcedimentoService>().To<ProcedimentoService>();
            Bind<IProntuarioService>().To<ProntuarioService>();
            Bind<IFuncaoService>().To<FuncaoService>();
            #endregion

            #region repository
            Bind(typeof(IBaseRepository<>)).To(typeof(BaseRepository<>));
            Bind<IContextManager>().To<ContextManager>();
            Bind<IUnitOfWork>().To<UnitOfWork>();
            Bind<IUsuarioRepository>().To<UsuarioRepository>();
            Bind<IGrupoUsuarioRepository>().To<GrupoUsuarioRepository>();
            Bind<IAlergiaRepository>().To<AlergiaRepository>();
            Bind<IAntecedenteRepository>().To<AntecedenteRepository>();
            Bind<ILocalEspecialidadeRepository>().To<LocalEspecialidadeRepository>();
            Bind<ILocalAtendimentoRepository>().To<LocalAtendimentoRepository>();
            Bind<IDiagnosticoRepository>().To<DiagnosticoRepository>();
            Bind<IDicionarioFoneticoRepository>().To<DicionarioFoneticoRepository>();
            Bind<ICuidadoRepository>().To<CuidadoRepository>();
            Bind<IDietaRepository>().To<DietaRepository>();
            Bind<IEspecialidadeRepository>().To<EspecialidadeRepository>();
            Bind<IExameRepository>().To<ExameRepository>();
            Bind<ILeitoRepository>().To<LeitoRepository>();
            Bind<IProcedimentoRepository>().To<ProcedimentoRepository>();
            Bind<IProntuarioRepository>().To<ProntuarioRepository>();
            Bind<IFuncaoRepository>().To<FuncaoRepository>();
            #endregion
        }
    }
}
